package Day_0201.JUC;

/**
 * @author zxc
 * @date 2023/02/01 17:37
 **/
public class DeadLock {
    public static void main(String[] args) {
        /**
         * 死锁产生的必要条件
         * 1. 互斥条件：一个资源每次只能被一个线程使用;
         * ===》 即，多线程情况下，共享资源在同一时刻只能够被一个线程所使用;
         *
         * 2. 请求与保持条件：一个线程因请求资源而阻塞时，对已获得的资源保持不放;
         * ===> 即，线程在阻塞情况下，不会释放已经获取的资源;
         *
         * 3. 不剥夺条件：线程已经获得的资源，在未使用完之前，不能强行剥夺;
         * ===> 即，某个线程在执行完之前，其所获取的资源不会被强行剥夺;
         *
         * 4. 循环等待条件：若干线程之间形成一种头尾相接的循环等待资源关系;
         * ===> 即，若干线程之间相互等待对方线程的资源释放;
         */

        /**
         * 如何避免死锁？
         * ===》 由于前三个条件为锁的特点，即针对循环等待进行处理，就能够避免死锁;
         *
         * 指定获取锁的顺序，举例如下：
         * 1. 比如某个线程只有获得A锁和B锁才能对某资源进行操作，在多线程条件下，如何避免死锁？
         * 2. 获得锁的顺序是一定的，比如规定，只有获得A锁的线程才有资格获取B锁，按顺序获取锁就可以避免死锁！！！
         *
         * ===》
         * 总结 ：即，规定拥有a锁的线程，才有资格去获取b锁;（指定获取锁的顺序;）
         */
    }
}
